/**
 * 表单数据工厂函数
 * 用于创建统一的表单数据结构，避免重复定义
 */

/**
 * 创建默认的表单数据结构
 * @returns {Object} 默认的表单数据对象
 */
export function createDefaultFormData() {
  return {
    id: null, // id
    menu_id: null, // 所属菜单
    title: null, // 标题
    method: null, // 请求方式
    key: null, // 键
    translations: [], // 语言数据
    type: null, // 类型
    gen_php: 1, // 生成php文件
    gen_vue: 1, // 生成vue文件
    code: null, // 权限标识
    remark: null, // 备注
    status: 1, // 状态
    sort: null, // 排序
    // 基本配置
    config: {
      // 方法属性
      action_color: null, // 按钮颜色 primary, success, warning, danger, info, default
      action_icon: null, // 按钮图标 element-icon / svg-icon
      action_show: [], // 按钮显示位置 toolbar, action_column, others
      // 特征信息
      is_toolbar_tools: null, // 是否是工具栏按钮
      has_btn: null, // 是否有操作按钮
      has_modal: null, // 是否使用弹窗
      has_fields: null, // 是否可以自定义字段
      has_cache: null, // 是否可以使用缓存
      has_join: null, // 是否可以关联多表
      has_sql: null, // 是否可以使用原生SQL
      has_value: null, // 是否可以设置值
      has_menu: null, // 是否可以跳转到菜单
      has_customize: null, // 是否可以自定义方法
      // 数据列表
      index: {
        select_type: null, // 行选择类型
        page_size: 15, // 默认页大小
        order_by: null, // 设置排序规则
        tree_config: null, // 树表配置
        filter: null, // 固定搜索条件 除了搜索栏的查询条件外，默认的搜索条件
        search_bar: null, // 是否显示搜索栏
        is_permission: 1, // 默认启用权限控制
      },
      // 弹窗
      modal: {
        height: null, // 弹窗高度
        width: null, // 弹窗宽度
      },
      // 字段及选项卡
      fields: {
        fields: [], // 可操作的字段
        tab_config: [], // 字段是否在选项卡中显示
      },
      // 其他选项
      cache: null, // -1 禁止，0 永久 1-N 缓存时间
      with_join: [], // 多表关联配置
      sql: null, // 原生SQL查询
      when_enable: null, // 操作按钮在什么时候可以用：选择【单行、多行、无行】有效，
      setting_value: null, // 为字段设置为某个值
      menu_route: null, // 跳转到什么菜单
      // 自定义方法
      customize: {
        has_fields: null, // 是否操作字段
        has_modal: null, // 是否使用弹窗
      },
      // 自定义的配置
      extend_config: {}, // 自定义的配置
    },
  };
}

/**
 * 创建表单数据，支持传入初始值进行合并
 * @param {Object} initialData - 初始数据，会与默认数据进行深度合并
 * @returns {Object} 合并后的表单数据对象
 */
export function createFormData(initialData = {}) {
  const defaultData = createDefaultFormData();
  return deepMerge(defaultData, initialData);
}

/**
 * 深度合并对象
 * @param {Object} target - 目标对象
 * @param {Object} source - 源对象
 * @returns {Object} 合并后的对象
 */
function deepMerge(target, source) {
  const result = { ...target };

  for (const key in source) {
    if (source.hasOwnProperty(key)) {
      if (
        source[key] &&
        typeof source[key] === 'object' &&
        !Array.isArray(source[key])
      ) {
        result[key] = deepMerge(target[key] || {}, source[key]);
      } else {
        result[key] = source[key];
      }
    }
  }

  return result;
}

/**
 * 重置表单数据到默认状态
 * @param {Object} formData - 要重置的表单数据对象
 * @param {Object} initialData - 可选的初始数据
 */
export function resetFormData(formData, initialData = {}) {
  const defaultData = createFormData(initialData);
  Object.keys(formData).forEach((key) => {
    if (defaultData.hasOwnProperty(key)) {
      formData[key] = defaultData[key];
    }
  });
}
